home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Class.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-27
|
7KB
|
185 lines
#ifndef Class_First
#ifdef __GNUG__
//pragma once
#pragma interface
#endif
#define Class_First
#include "Object.h"
enum ClassFlags {
eClassAbstract = BIT(eObjLast + 1), // abstract class
eClassObject = BIT(eObjLast + 2), // ???
eClassLast = eObjLast + 2
};
//---- Class -------------------------------------------------------------------
class Class: public Object {
static class Class *classptr;
Class *super;
char *className, *version, *declFileName, *implFileName;
Object *proto;
int myId, size, declFileLine, implFileLine, instanceCount;
class OrdCollection* subclasses;
class Collection *methods;
public:
MetaDef(Class);
Class(char *name, int sz, Object *pro, char *in, char *dn, int il,
int dl, bool abstract);
Class(char *name, char *vers);
~Class();
//---- attributes
char *Name() const
{ return className; }
int Size() const
{ return size; }
bool IsAbstract()
{ return TestFlag(eClassAbstract); }
Object *Proto() const
{ return proto; }
OrdCollection *SubClasses()
{ return subclasses; }
//---- class hierarchy
Class *Super() const
{ return super; }
Class *SetSuper();
bool isKindOf(Class*);
void AddSubclass(Class*);
class Iterator *SubclassIterator();
//---- comparing
u_long Hash();
bool IsEqual(Object*);
int Compare(Object*);
//---- converting, input/output
char* AsString();
virtual void Show(char *buf, void *addr, int len, bool isptr);
OStream& PrintOn(OStream&);
Object *ReadAndMap(IStream&);
//---- members
Object *SomeMember();
void EnumerateMembers(AccessMembers *accessor= 0);
void EnumerateMyMembers(AccessMembers *accessor= 0);
//---- methods
Collection *GetMethods()
{ return methods; }
void SetMethods(Collection *col)
{ methods= col; }
//---- source access
const char *GetDeclFileName()
{ return declFileName; }
const char *GetImplFileName()
{ return implFileName; }
int GetImplFileLine()
{ return implFileLine; }
int GetDeclFileLine()
{ return declFileLine; }
//---- instance statistics
Object *SomeInstance();
void AddInstance()
{ instanceCount++; }
int GetInstanceCount()
{ return instanceCount; }
void ResetInstanceCount()
{ instanceCount= 0; }
};
//---- SimpleMetaImpl macros ---------------------------------------------------
#define _SimpleMetaImpl(name,printname) \
class _NAME2_(name,Class): public Class { \
public: \
_NAME2_(name,Class)() : Class(_QUOTE_(printname), sizeof(name), 0, \
__FILE__, __FILE__, __LINE__, \
__LINE__, FALSE) \
{ } \
void Show(char *buf, void *addr, int len, bool isptr); \
}; \
static _NAME2_(name,Class) _NAME2_(name,ClassMetaImpl0); \
Class *SMeta(name)= &_NAME2_(name,ClassMetaImpl0); \
void _NAME2_(name,Class)::Show(char *buf, void *addr, int len, bool isptr)
#define SimpleMetaImpl(name) _SimpleMetaImpl(name,name)
//---- MetaImpl macros ---------------------------------------------------------
#define _MetaImpl0(name,super,abstract) \
Class *name::isa; \
static Class _NAME2_(name,ClassMetaImpl0)(_QUOTE_(name), sizeof(name), \
new name((class _dummy*)0), \
__FILE__, \
_NAME2_(name,DeclFileName)(), \
__LINE__, \
_NAME2_(name,DeclFileLine)(), \
abstract); \
name::name(class _dummy *d) : super(d) \
{ isa= _NAME2_(name,ClassMetaImpl0).SetSuper(); } \
Class *name::IsA() \
{ return &_NAME2_(name,ClassMetaImpl0); }
#define MetaImpl0(name) \
_MetaImpl0(name,,FALSE) \
void name::Members(AccessMembers *) { }
#define MetaImpl(name,list) \
_MetaImpl0(name,,FALSE) \
void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
#define AbstractMetaImpl0(name) \
_MetaImpl0(name,,TRUE) \
void name::Members(AccessMembers *) { }
#define AbstractMetaImpl(name,list) \
_MetaImpl0(name,,TRUE) \
void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
#define NewMetaImpl0(name,super) \
_MetaImpl0(name,super,FALSE) \
void name::Members(AccessMembers *) { }
#define NewMetaImpl(name,super,list) \
_MetaImpl0(name,super,FALSE) \
void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
#define NewAbstractMetaImpl0(name,super) \
_MetaImpl0(name,super,TRUE) \
void name::Members(AccessMembers *) { }
#define NewAbstractMetaImpl(name,super,list) \
_MetaImpl0(name,super,TRUE) \
void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
//---- type specifiers for metaclass macros ------------------------------------
#define _offset(in) (u_long)&in
#define _aoffset(in) (u_long)in
#define _TO(x) _Type(TYPEOF(x))
#define TC(in,cast) (_an++,T_SIM), _QUOTE_(in), _Type((cast*)&in), _offset(in)
#define T(in) (_an++,T_SIM), _QUOTE_(in), _Type(&in), _offset(in)
#define TP(in) (_an++,T_PTR), _QUOTE_(in), _Type(in), _offset(in)
#define TS(in) (_an++,T_STR), _QUOTE_(in), _Type(in), _offset(in)
#define TA(in) (_an++,T_ARR), _QUOTE_(in), _Type(in), _aoffset(in), sizeof(in)/sizeof(*in)
#define TV(in,len) (_an++,T_VEC), _QUOTE_(in), _Type(in), _offset(in), _offset(len)
#define TPP(in) (_an++,T_PTR+T_PTR2), _QUOTE_(in), _TO(in), _offset(in)
#define TSP(in) (_an++,T_STR+T_PTR2), _QUOTE_(in), _TO(in), _offset(in)
#define TAP(in) (_an++,T_ARR+T_PTR2), _QUOTE_(in), _TO(in), _aoffset(in), sizeof(in)/sizeof(*in)
#define TVP(in,len) (_an++,T_VEC+T_PTR2), _QUOTE_(in), _TO(in), _offset(in), _offset(len)
#endif